﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;



static class Literal
{
    private static List<string> SaveBox = new List<string>();//リテラル避難用

    public static void Move(ref string Code)
    {
        Regex mm = new Regex(@"(@""([^""]|"""")*"")|(""([^\\""]|\\.)*"")");
        while(mm.Match(Code).Success == true)//見つかる間
        {
            Match m = mm.Match(Code);

            SaveBox.Add(m.Value);

            #region debug
#if DEBUG
            Console.WriteLine("[Literal::Move]{0}",SaveBox[SaveBox.Count-1]);
#endif
            #endregion

            Code = Code.Remove(m.Index, m.Length);
            Code = Code.Insert(m.Index, "LITERAL<" + (SaveBox.Count-1) + ">");
        }
    }

    #region 文字列用のUndoメゾット。念のため残しておきます。
#if DEBUG
    public static void Undo(ref string Code)
    {
        Regex mm = new Regex(@"LITERAL<\d+>");
        while (mm.Match(Code).Success == true)//見つかる間
        {
            Match m = mm.Match(Code);//マッチしたものを取得
            Match mmm = Regex.Match(m.Value, @"<\d+>");//<>のインデックスを取得

            #region debug
#if DEBUG
            Console.WriteLine("[Literal::Undo]{0}", mmm.Value);
#endif
            #endregion

            Code = Code.Remove(m.Index, m.Length);//LITERAL...を削除
            Code = Code.Insert(m.Index, SaveBox[int.Parse(mmm.Value.Replace("<","").Replace(">",""))]);//リテラルを挿入
        }
    }
#endif
    #endregion

    public static void Undo(ref string[] Codes)
    {

        int counter = 0;//Codesの要素数カウンタ。
        foreach (string Code in Codes)
        {
            Regex mm = new Regex(@"LITERAL<\d+>");
            if (mm.Match(Code).Success == true)//リテラル置換指定子なら
            {

                Match mmm = Regex.Match(mm.Match(Code).Value, @"<\d+>");//<>のインデックスを取得

                #region debug
#if DEBUG
                Console.WriteLine("[Literal::Undo]{0}", mmm.Value);
#endif
                #endregion

                Codes[counter] = SaveBox[int.Parse(mmm.Value.Replace("<", "").Replace(">", ""))];
            }

            counter++;
        }
    }
}